/*
 * @lc app=leetcode.cn id=1018 lang=typescript
 *
 * [1018] 可被 5 整除的二进制前缀
 */

// @lc code=start
// 正常方式转js 数字 栈溢出 或超时。。。
// function prefixesDivBy5(nums: number[]): boolean[] {
//     let final: boolean[] = [];
//     for (let i = 0; i < nums.length; i++) {
//         // 巧妙借用先进的 BitInt 技术
//         const bool = !(BigInt("0b" + nums.slice(0, i + 1).join("")) % 5n);
//         final.push(bool);
//     }
//     return final;
// }

// FIXME 二进制除余 数学法，数学鬼。。。
function prefixesDivBy5(nums: number[]): boolean[] {
    const answer = [];
    let prefix = 0;
    const length = nums.length;
    for (let i = 0; i < length; i++) {
        // 使用位移的方式来解决
        // 将多余的数字赋值回 prefix
        // 因为是使用位的方式，实质上这个还是 10 进制
        prefix = ((prefix << 1) + nums[i]) % 5;
        answer.push(prefix === 0);
    }
    return answer;
}
// @lc code=end
